#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include <string.h>
#include <math.h>
#define rozliseni 0.0033
#define A 0.003354016
#define B 0.0002569850
#define C 0.000002620131
#define D 0.00000006383091
#define refOdpor 1480
char *result;
#define t1 0


/*
 * Poslani znaku po UARTu
 */
void putchar(unsigned char posli) {
        while (!(UCSRA&0x20))
        ;
        UDR = posli;
} 

/*
 * Nastaveni A/D prevodniku
*/
void nastaveniADC(void) 
{
	ADCSRA|= (0 << ADPS2) | (0 << ADPS1) | (1 << ADPS0);	// Nasteveni Prescale na 2
	ADMUX|= (1<<REFS1)|(1<<REFS0);		// Nastevni vnitrniho Uref=2.56
	ADCSRA|=(1<<ADFR); 		// Free running mode
	ADCSRA|=(1<<ADEN);		//Enable ADC
}

/*
 * Cteni dat z ADC
*/
int cteniADC(void)				// Mozna pozdeji predelat na interrupt
{
	ADCSRA|=0x40;		// Start prevodu
    while (!(ADCSRA & 0x10));	//  Cekani, doku neni dokoncen prevod
    ADCSRA|=0x10;
    return ADCW;		// Registry ADCL a ADCH v jednom
}

/*
 * Vypocet teploty pomoci Stein-Hartovo aproximace
*/
double vypocetTeploty(int a)
{
	double odpor;
	double mezi;
	double teplota;
	double napeti;
	double x;
	
	napeti=a * rozliseni; 		// Prevod na napeti

	odpor = (7500 - napeti*refOdpor)/napeti;		// Vypocet odporu
	x=odpor/4700;					// Pomer mezi odporem a referecnim odporem - pri 25 stupnich
	mezi = (A + B*log(x)+ C*(log(x)*(log(x))) + D*(log(x)*log(x)*(log(x)))); // Vypocet teploty
	teplota=(1/mezi)-273.15;		// Precpocet na stupne Celsia
	return teplota;
}


int main(void)
{

	 int prevod;
	 int xux;
	 int i;
	 double vysledek;
	 
	 DDRB |= (1<<PB0);
     PORTB =(1<<PB0);	// Port na LEDku
	 UCSRA|=0x00;                    
     UBRRL|=0x0C;  // nastaveni rychlosti pro krystal 1MHz
     UCSRB|=0x18;  // povolit vysilani a prijem
     UCSRC|=0x86;  // ramec dat:  8 datovych, 1 stop bit, bey parity 
	 nastaveniADC();
	 DDRC|=0x20;
     PORTC|=0x20;
	 ADMUX=0x40;
	 while(1)
	 {
	    prevod = cteniADC();  // Prevod
		 _delay_ms(t1);
		vysledek = vypocetTeploty(prevod); // Vypocet odporu
	    xux=(int)vysledek;
	    unsigned char x = xux;		// Kontrolni vypis
        unsigned char y = xux >> 8;
    	putchar(x);
	    putchar(y);
	    _delay_ms(1000);
		
		
	    if(vysledek>20.0)   // Pokud teplota vyssi nez 20 -> sviti LEDka
		{
		    PORTB &= ~(_BV(PB0));
			_delay_ms(3000);
			PORTB|=(1<<PB0);  		// Zhasnout
		}
	 }
}
	
